Jenkins 后端服务流水线部署脚本
此处配置的节点是用来执行脚本中的每一个步骤(stage)的,包括但不限于代码构建、镜像构建/推送等
agent any
agent { label 'master' }
此处配置的环境变量可在整个脚本内使用,将动态的变量设置在此处可形成通用脚本,需要复制流水线时修改此处的变量即可
environment {
// Git 仓库配置
GIT_URL = 'git@git.xxx.com:xxx.git'// 替换为你的代码仓库
GIT_KEY_ACR_CRED = 'git-ssh-key'
// Docker 镜像相关配置
DOCKER_IMAGE_REGISTRY = 'registry.xxx.aliyuncs.com'// 替换为你的镜像仓库
DOCKER_IMAGE_ACR_CRED = 'docker-cred'
IMAGE_PRE_NAME = 'xxxx'// 镜像名称前缀
IMAGE_NAME = 'xxx-service'// 替换为你的应用名称
// 远程服务器
REMOTE_HOST = 'xxx.xxx.xxx.xx'// 服务器 IP
REMOTE_HOST_ACR_CRED = 'host-cred'
}
这里设置构建代码的 Maven 工具
tools {
// Install the Maven version configured as "M3" and add it to the path.
maven "Maven3"
}
拉取仓库中的代码
此操作属于运行在节点的步骤,需要添加在 stages 对象中
stage('Checkout') {
steps {
// Get some code from a GitHub repository
git branch: 'master',
url: GIT_URL,
credentialsId: GIT_KEY_ACR_CRED
}
}
使用 Maven 构建 Maven 工程中的 Java 代码
此操作属于运行在节点的步骤,需要添加在 stages 对象中
stage('Build') {
steps {
// Run Maven on a Unix agent.
sh "mvn -Dmaven.test.failure.ignore=true clean package"
// To run Maven on a Windows agent, use
// bat "mvn -Dmaven.test.failure.ignore=true clean package"
}
post {
// If Maven was able to run the tests, record the test results and archive the jar file.
success {
archiveArtifacts 'target/*.jar'
}
}
}
此操作属于运行在节点的步骤,需要添加在 stages 对象中
stage('Build and Push Docker Image') {
steps {
script {
// 生成时间戳
def timestamp = new Date().format('yyyyMMddHHmm', TimeZone.getTimeZone('Asia/Shanghai'))
def imageTag = "${IMAGE_NAME}:${timestamp}"
def fullImageNameWithTimestamp = "${DOCKER_IMAGE_REGISTRY}/${IMAGE_PRE_NAME}/${imageTag}"
// 使用宿主机 Docker 构建镜像
echo "Building Docker image: ${fullImageNameWithTimestamp}"
sh "docker build -t ${fullImageNameWithTimestamp} ."
withCredentials([usernamePassword(credentialsId: DOCKER_IMAGE_ACR_CRED, usernameVariable:'REG_USER', passwordVariable:'REG_PASS')]) {
// 登录到镜像仓库
echo "Login Docker..."
sh "docker login --username \$REG_USER -p \$REG_PASS \$DOCKER_IMAGE_REGISTRY"
// 推送镜像
echo "Push Docker Image ${fullImageNameWithTimestamp}"
sh "docker push ${fullImageNameWithTimestamp}"
}
// 输出构建信息
echo "Successfully built and pushed image: ${fullImageNameWithTimestamp}"
// 将镜像名称保存到环境变量,供后续步骤使用
env.BUILT_IMAGE = fullImageNameWithTimestamp
}
}
}
此操作属于运行在节点的步骤,需要添加在 stages 对象中
stage('Deploy to Remote Host') {
steps {
withCredentials([usernamePassword(credentialsId: REMOTE_HOST_ACR_CRED, usernameVariable: 'REMOTE_USER', passwordVariable: 'REMOTE_PWD')]) {
sh """
sshpass -p \$REMOTE_PWD ssh -T -o StrictHostKeyChecking=no \
\$REMOTE_USER@${REMOTE_HOST} << 'EOF'
# 去往工作目录
cd /app/${IMAGE_NAME}
# 修改 .env 文件
sed -i '/${IMAGE_NAME}/c\\SERVICE_V=${BUILT_IMAGE}' .env
# 停止目标服务
docker-compose stop ${IMAGE_NAME}
# 删除目标容器
docker-compose rm -f ${IMAGE_NAME}
# 启动目标容器
docker-compose up -d ${IMAGE_NAME}
EOF
"""
}
}
}
pipeline {
agent { label 'master' }
environment {
// Git 仓库配置
GIT_URL = 'git@git.xxx.com:xxx.git'// 替换为你的代码仓库
GIT_KEY_ACR_CRED = 'git-ssh-key'
// Docker 镜像相关配置
DOCKER_IMAGE_REGISTRY = 'registry.xxx.aliyuncs.com'// 替换为你的镜像仓库
DOCKER_IMAGE_ACR_CRED = 'docker-cred'
IMAGE_PRE_NAME = 'xxxx'// 镜像名称前缀
IMAGE_NAME = 'xxx-service'// 替换为你的应用名称
// 远程服务器
REMOTE_HOST = 'xxx.xxx.xxx.xx'// 服务器 IP
REMOTE_HOST_ACR_CRED = 'host-cred'
}
tools {
// Install the Maven version configured as "M3" and add it to the path.
maven "Maven3"
}
stages {
stage('Checkout') {
steps {
// Get some code from a GitHub repository
git branch:'master',
url: GIT_URL,
credentialsId: GIT_KEY_ACR_CRED
}
}
stage('Build') {
steps {
// Run Maven on a Unix agent.
sh "mvn -Dmaven.test.failure.ignore=true clean package"
// To run Maven on a Windows agent, use
// bat "mvn -Dmaven.test.failure.ignore=true clean package"
}
post {
// If Maven was able to run the tests, record the test results and archive the jar file.
success {
archiveArtifacts 'target/*.jar'
}
}
}
stage('Build and Push Docker Image') {
steps {
script {
// 生成时间戳
def timestamp = new Date().format('yyyyMMddHHmm', TimeZone.getTimeZone('Asia/Shanghai'))
def imageTag = "${IMAGE_NAME}:${timestamp}"
def fullImageNameWithTimestamp = "${DOCKER_IMAGE_REGISTRY}/${IMAGE_PRE_NAME}/${imageTag}"
// 使用宿主机 Docker 构建镜像
echo "Building Docker image: ${fullImageNameWithTimestamp}"
sh "docker build -t ${fullImageNameWithTimestamp} ."
withCredentials([usernamePassword(credentialsId: DOCKER_IMAGE_ACR_CRED, usernameVariable:'REG_USER', passwordVariable:'REG_PASS')]) {
// 登录到镜像仓库
echo "Login Docker..."
sh "docker login --username \$REG_USER -p \$REG_PASS \$DOCKER_IMAGE_REGISTRY"
// 推送镜像
echo "Push Docker Image ${fullImageNameWithTimestamp}"
sh "docker push ${fullImageNameWithTimestamp}"
}
// 输出构建信息
echo "Successfully built and pushed image: ${fullImageNameWithTimestamp}"
// 将镜像名称保存到环境变量,供后续步骤使用
env.BUILT_IMAGE = fullImageNameWithTimestamp
}
}
}
stage('Deploy to Remote Host') {
steps {
withCredentials([usernamePassword(credentialsId: REMOTE_HOST_ACR_CRED, usernameVariable:'REMOTE_USER', passwordVariable:'REMOTE_PWD')]) {
sh """
sshpass -p \$REMOTE_PWD ssh -T -o StrictHostKeyChecking=no \
\$REMOTE_USER@${REMOTE_HOST} << 'EOF'
# 去往工作目录
cd /app/${IMAGE_NAME}
# 修改 .env 文件
sed -i '/${IMAGE_NAME}/c\\SERVICE_V=${BUILT_IMAGE}' .env
# 停止目标服务
docker-compose stop ${IMAGE_NAME}
# 删除目标容器
docker-compose rm -f ${IMAGE_NAME}
# 启动目标容器
docker-compose up -d ${IMAGE_NAME}
EOF
"""
}
}
}
}
}